﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Sub.TaskPlanningDesk.WebSite.Infrastructure;
using Microsoft.Practices.Unity;
using Sub.TaskPlanningDesk.Model.Services.Account;
using Sub.TaskPlanningDesk.WebSite.Controllers;
using Sub.TaskPlanningDesk.Model.Repositories;
using Sub.TaskPlanningDesk.Model.Services.Projects;
using Sub.TaskPlanningDesk.WebSite.ViewModels.Tasks;
using Sub.TaskPlanningDesk.WebSite.Infrastructure.Binders;

namespace Sub.TaskPlanningDesk.WebSite
{
	// Note: For instructions on enabling IIS6 or IIS7 classic mode, 
	// visit http://go.microsoft.com/?LinkId=9394801

	public class MvcApplication : System.Web.HttpApplication
	{
		public static void RegisterGlobalFilters(GlobalFilterCollection filters)
		{
			filters.Add(new HandleErrorAttribute());
		}

		public static void RegisterRoutes(RouteCollection routes)
		{
			routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
			routes.IgnoreRoute("favicon.ico");

			routes.MapRoute(
				"Default", // Route name
				"{controller}/{action}/{id}", // URL with parameters
				new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
			);
		}

		protected void Application_Start()
		{
			AreaRegistration.RegisterAllAreas();

			RegisterGlobalFilters(GlobalFilters.Filters);
			RegisterRoutes(RouteTable.Routes);

			var container = new UnityContainer();
			RegisterControllers(container);
			RegisterDependecies(container);

			var factory = new UnityControllerFactory(container);
			ControllerBuilder.Current.SetControllerFactory(factory);

			RegisterModelBinders(container);
		}

		private void RegisterModelBinders(UnityContainer container)
		{
			ModelBinders.Binders.Add(typeof(TaskModel), new TaskModelBinder(container.Resolve<IProjectService>()));
		}

		private void RegisterControllers(UnityContainer container)
		{
			container.RegisterType<IController, AccountController>(TheControllers.Account.ToLower());
			container.RegisterType<IController, HomeController>(TheControllers.Home.ToLower());
			container.RegisterType<IController, ProjectController>(TheControllers.Project.ToLower());
			container.RegisterType<IController, TaskController>(TheControllers.Task.ToLower());
		}

		private void RegisterDependecies(UnityContainer container)
		{
			container.RegisterType<IProjectRepository, ProjectRepository>();
			container.RegisterType<ITaskRepository, TaskRepository>();
			container.RegisterType<IUserRepository, UserRepository>();
			container.RegisterType<IProjectService, ProjectService>();
			container.RegisterType<ITaskService, TaskService>();
			container.RegisterType<IMembershipService, AccountMembershipService>();
			container.RegisterType<IFormsAuthenticationService, FormsAuthenticationService>();
		}
	}
}